#include <REGX52.H>
#include <INTRINS.H>
//引脚定义
sbit OneWire_DQ = P3^7;
/**
  * @brief  单总线初始化
  * @param  无
  * @retval 从机响应位，0为响应，1为未响应
  */
unsigned char OneWire_Init()
{
	unsigned char i,AckBit;
	EA = 0;        //Enable置0
	OneWire_DQ = 1;//置高位
	OneWire_DQ = 0;//置低位
	_nop_();i = 227;while (--i);//delay 500us
	OneWire_DQ = 1;//置高位
	_nop_();i = 29;while (--i);//delay 70us
	AckBit = OneWire_DQ;//读取响应位
	_nop_();i = 227;while (--i);//delay 500us
	EA = 1;        //Enable置一
  return AckBit;   //返回响应
}
/**
  * @brief  单总线发送一位
  * @param  Bit 要发送的位
  * @retval 无
  */
void OneWire_SendBit(unsigned char Bit)
{
	unsigned char data i;
	EA = 0;
	OneWire_DQ = 0;
	i = 2;while (--i);//delay 10us
	OneWire_DQ = Bit;
	_nop_();i = 20;while (--i);//delay 50us	
	OneWire_DQ = 1;
	EA = 1;
}
/**
  * @brief  单总线接收一位
  * @param  无
  * @retval 读取的位
  */
unsigned char OneWire_ReceiveBit()
{
	unsigned char data i;
	unsigned char Bit;
	EA = 0;
	OneWire_DQ = 0;
	i = 1;while (--i);//delay 5us
	OneWire_DQ = 1;
	i = 1;while (--i);//delay 5us
	Bit = OneWire_DQ;
	_nop_();i = 20;while (--i);//delay 50us
	EA = 1;
	return Bit;
}
/**
  * @brief  单总线发送一个字节
  * @param  Byte 要发送的字节
  * @retval 无
  */
void OneWire_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		OneWire_SendBit(Byte&(0x01<<i));
	}
}
/**
  * @brief  单总线接收一个字节
  * @param  无
  * @retval 接收的一个字节
  */
unsigned char OneWire_ReceiveByte()
{
	unsigned char i;
	unsigned char Byte=0x00;
	for(i=0;i<8;i++)
	{
		if(OneWire_ReceiveBit())Byte|=(0x01<<i);
	}
	return Byte;
}